//
//  "$Id: Raid.h 37607 2011-10-10 05:32:33Z wang_haifeng $"
//
//  Copyright (c)1992-2010, ZheJiang Dahua Technology Stock CO.LTD.
//  All Rights Reserved.
//
//	Description:
//	Revisions:		Year-Month-Day  SVN-Author  Modification
//

#ifndef __STORAGE_RAID_API_H__
#define __STORAGE_RAID_API_H__

#include "Types.h"
#include "Defs.h"
#include "Storage.h"

#ifdef __cplusplus
extern "C" {
#endif

/// \defgroup StorageRaidAPI API StorageRaid
/// RAID接口。
/// @{


/// RAID状态(复)
typedef enum StorageRaidState 
{
	storageRaidActive = 0x01,		///< part1
	storageRaidInactive = 0x02,		///< part1
	storageRaidClean = 0x04,		///< part1
	storageRaidFailed = 0x08,		///< part2
	storageRaidDegraded = 0x10,		///< part2
	storageRaidRecovering = 0x20,	///< part3
	storageRaidResyncing = 0x40,	///< part3
	storageRaidReshaping = 0x80,	///< part3
	storageRaidChecking = 0x100,	///< part3
	storageRaidNotStarted = 0x200	///< part4
} StorageRaidState;


/// RAID设备信息结构，32位系统下128字节
typedef struct StorageRaidInfo
{
	char	level;			///< RAID等级
	char	raidDevices; 	///< RAID设备个数
	char	totalDevices; 	///< RAID设备个数
	uint32	state;			///< RAID状态，StorageRaidState位组合
	char	activeDevices;	///< 活动设备个数
	char	workingDevices;	///< 工作设备个数
	char	failedDevices;	///< 失败设备个数
	char	spareDevices;	///< 热备设备个数
	float	recoverPercent;	///< 同步百分比
	float	recoverMBps;	///< 同步速度，MBps为单位
	uint	recoverTimeRemain;///<剩余时间，分钟为单位
	int		reserved[26];	///< 保留
} StorageRaidInfo;


/// 存储设备接口, 128个指针
typedef struct StorageRaid
{
	/// 底层私有数据
	void *priv;


	/// 增加接口引用
	int (*addRef)(struct StorageRaid *thiz);


	/// 释放接口
	int (*release)(struct StorageRaid *thiz);


	/// 针对RAID磁盘阵列,获得所属硬盘列表;
	/// 
	/// \param [in] thiz 本接口指针
	/// \param [out] list 物理硬盘信息列表
	/// \param [in,out] num 输入最大个数，输出实际个数
	/// \retval 0  获取成功
	/// \retval <0  获取失败
	int (*getMembers)(struct StorageRaid* thiz, StorageInfo* list, int* max);
	
	
	/// 针对RAID磁盘阵列,获得RAID信息
	/// 
	/// \param [in] thiz 本接口指针
	/// \param [out] info RAID信息结构体
	/// \retval 0  获取成功
	/// \retval <0  获取失败
	int (*getInfo)(struct StorageRaid* thiz, StorageRaidInfo* info);


	/// 制作RAID磁盘阵列，相当于于独立虚拟硬盘，其下的物理硬盘(或RAID盘)不允许再配置;
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] listname 要被绑定的物理硬盘(或RAID盘)名称列表
	/// \param [in] number 要绑定的物理硬盘(或RAID盘)数量
	/// \param [in] level 虚拟硬盘的RAID级别, 如0, 1, 5
	/// \retval <0 操作失败
	/// \retval 0 操作成功
	int (*makeRaid)(struct StorageRaid* thiz, const char** listname, int number, int level);
	
	
	/// 取消RAID磁盘阵列，取消后需要恢复原物理硬盘的配置;
	///
	/// \param [in] thiz 本接口指针
	/// \retval <0 操作失败
	int (*breakRaid)(struct StorageRaid* thiz);
	
	
	/// 从RAID组中移除一块磁盘
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] name 磁盘盘符名称, 如"/dev/sda" "/dev/sdb"
	/// \retval <0 操作失败
	/// \retval 0 操作成功
	int (*removeDisk)(struct StorageRaid *thiz, const char *name);


	/// 向RAID组中添加一块磁盘
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] name 磁盘盘符名称, 如"/dev/sda" "/dev/sdb"
	/// \retval <0 操作失败
	/// \retval 0 操作成功
	int (*addDisk)(struct StorageRaid *thiz, const char *name);

	
	/// 保留
	void* reserved[119];

} StorageRaid;


/// 存储设备接口描述, 32位系统下128字节
typedef struct StorageRaidDesc
{
	/// RAID的名称。NULL表示创建一个新的RAID，此RAID名称由底层自动生成；如果传入
	/// 名称不存在表示创建一个指定名称的RAID；如果传入的名称存在表示打开对应的
	/// RAID设备进行控制。
	const char*  name;
	
	/// 保留
	int reserved[31];
} StorageRaidDesc;


/// 创建存储设备接口
///
/// \param [in] desc RAID接口描述结构 StorageRaidDesc 指针，
/// 			设备名是用户指定的。
/// \param [out] storage 存储设备接口指针的指针
/// \retval <0 创建失败
/// \retval 0 创建成功
int PAL_API createStorageRaid(StorageRaidDesc *desc, StorageRaid** raid);


/// @} end of group

#ifdef __cplusplus
}
#endif

#endif //__STORAGE_API_H__

